package cn.itcast.zt;

import lombok.*;

import java.io.Serializable;
import java.util.Comparator;

/**
 * create by zhangtian105 on 2021/3/18
 */
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode // 默认情况下使用类型所有的字段（不包括 static 和 transient 字段）参与到 equals 和 hashCode 方法的实现中
public class Person implements Serializable, Comparable<Person> {
    private static final long serialVersionUID = 447758464571749749L;
    private String id ;
    private String name ;

    /**
     * 这段逻辑是id如果相同则认为是同一个对象，equal判断就是true
     * @param o
     * @return
     */
    /*@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        return id != null ? id.equals(person.id) : person.id == null ? true : false ;
    }*/

    /**
     * 重写hashCode之后，对于hash判断的Set集合，add如果两个对象的hash值相同，则不会重复塞进去
     * @return
     */
    /*@Override
    public int hashCode() {
        int result = id != null ? id.hashCode() : 0;
        result = 31 * result;
        return result;
    }*/

    /**
     * 对于自定义的类型，如果要实现 Comparable，请记得 equals、hashCode、compareTo 三者逻辑一致。
     * @param o
     * @return
     */
    @Override
    public int compareTo(Person o) {
        return Comparator.comparing(Person::getId)
                .thenComparing(Person::getName)
                .compare(this, o);
    }
}
